package main

import (
	"fmt"
)

type ValNode struct {
	row int
	col int
	val int
}

func main() {

	// 1. 先创建一个原始数组
	var chessMap [11][11]int 

	// 1代表黑子，2代表蓝子
	chessMap[1][2] = 1
	chessMap[2][3] = 2

	// 2. 输出看看原始数组
	for _, v := range chessMap {
		for _, v2 := range v {
			fmt.Printf("%d\t", v2)
		}
		fmt.Println()
	}

	// 3. 转成稀疏数组
	// 遍历chessMap，如果发现有一个元素的值不等于0，就创建一个node结构体
	// 将其放入到对应的切片中
	var sparseArr []ValNode

	// 标准的稀疏数组还有一个记录元素的二维数组的规模(行和列，默认值)
	valNode := ValNode {
		row : 11,
		col : 11,
		val : 0,
	}
	sparseArr = append(sparseArr, valNode)

	for i, v := range chessMap {
		for j, v2 := range v {
			if v2 != 0 {
				// 创建一个节点ValNode值节点
				valNode = ValNode {
					row : i,
					col : j,
					val : v2,
				}
				sparseArr = append(sparseArr, valNode)
			}
		}
	}

	fmt.Println("-----------------------")
	for i, valNode := range sparseArr{
		fmt.Printf("%d: %d %d %d\n", i, valNode.row, valNode.col, valNode.val)
	}

	fmt.Println("-----------恢复----------")

	var chessMap2 [11][11]int
	// 遍历sparseArr [遍历文件每一行]
	for i, valNode := range sparseArr {
		if i == 0 {
			continue
		}
		chessMap2[valNode.row][valNode.col] = valNode.val
	}

	for _, v := range chessMap2 {
		for _, v2 := range v {
			fmt.Printf("%d\t", v2)
		}
		fmt.Println()
	}

}